/**
 * UUID 工具类
 */
export class UUID {

  /**
   * 生成安全的 uuid（基于加密安全的随机源）
   * @returns uuid
   */
  public static uuid(): string {
    try {
      // 检查环境是否支持crypto API
      if (typeof crypto !== 'undefined') {
        if (typeof crypto.randomUUID === 'function') {
          // 优先使用原生的randomUUID方法（现代浏览器和Node.js 14+支持）
          return crypto.randomUUID();
        }

        // 如果不支持randomUUID，使用getRandomValues生成
        const rnds = new Uint8Array(16);
        crypto.getRandomValues(rnds);

        // 设置版本位 (版本4)
        rnds[6] = (rnds[6] & 0x0f) | 0x40;
        // 设置变体位
        rnds[8] = (rnds[8] & 0x3f) | 0x80;

        // 转换为十六进制字符串并添加连字符
        const res = [];
        for (let i = 0; i < 16; i++) {
          res.push(rnds[i].toString(16).padStart(2, '0'));
        }

        return [
          res.slice(0, 4).join(''),
          res.slice(4, 6).join(''),
          res.slice(6, 8).join(''),
          res.slice(8, 10).join(''),
          res.slice(10, 16).join('')
        ].join('-');
      }

      // 如果环境不支持加密API，使用不安全的方法
      console.warn('当前环境不支持加密API，将使用不安全的UUID生成方法');
      return this.unsafe();
    } catch (error) {
      console.error('生成安全UUID失败', error);
      return this.unsafe();
    }
  }

  /**
   * 生成简单的 uuid，没有 - 连接符
   * @returns uuid
   */
  public static simple(): string {
    return this.uuid().replace(/-/g, '');
  }

  /**
   * 生成不安全的 uuid（基于Math.random，不推荐用于安全敏感场景）
   * @returns 不安全的uuid，含有连接符
   */
  public static unsafe(): string {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
      const r = Math.random() * 16 | 0;
      const v = c === 'x' ? r : (r & 0x3 | 0x8);
      return v.toString(16);
    });
  }
}
